package face.jvm;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by zhangyanfei on 2019/6/6.
 * JVM  java虚拟机
 *
 * JMM java内存模型
 *
 * 主内存
 *
 * 工作内存
 *
 * @author zhangyanfei
 * @date 2019/06/06
 */
public class Myvolatile {

    static class Mydata {
        private volatile AtomicInteger a = new AtomicInteger();

        // 可见性
        //public void add60() {
        //    this.a = 60;
        //}

        // 原子性 cpu一个命令 无法保证
        public  void add() {
            a.getAndAdd(1);
        }

    }

    public static void main(String[] args) {
        Mydata mydata = new Mydata();

        /**
         * 可见线 验证
         */
        //new Thread(() -> {
        //    System.out.println(Thread.currentThread().getName() + "come in");
        //    try {
        //        Thread.sleep(3000);
        //    } catch (InterruptedException e) {
        //        e.printStackTrace();
        //    }
        //    mydata.add60();
        //    System.out.println(Thread.currentThread().getName() + "update to " + mydata.a);
        //
        //}, "aa").start();
        //
        //new Thread(() -> {
        //    System.out.println(Thread.currentThread().getName() + mydata.a);
        //    while (mydata.a == 0) {
        //
        //    }
        //    System.out.println(Thread.currentThread().getName() + "over");
        //}, "bb").start();

        // 原子性验证
        for (int j = 0; j < 20; j++) {
            new Thread(() -> {
                for (int i = 0; i < 10000; i++) {
                    mydata.add();
                }
            }, "CC").start();
        }

        /**
         * gc main
         */
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }

        System.out.println(mydata.a);
    }

}
